#include "myusart.h"

//USART1 初始化
void USART1_Init(u32 bound){

    //时钟信号
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    GPIO_InitTypeDef initdef;
    initdef.GPIO_Speed=GPIO_Speed_50MHz;
    initdef.GPIO_Pin=GPIO_Pin_9;//数据输出
    initdef.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
    GPIO_Init(GPIOA,&initdef);

    initdef.GPIO_Pin=GPIO_Pin_10;//数据输出
    initdef.GPIO_Mode=GPIO_Mode_IN_FLOATING;//复用推挽输出
    GPIO_Init(GPIOA,&initdef);


    //usart1初始化
    USART_InitTypeDef usartInitDef;
    usartInitDef.USART_BaudRate=bound;//设置波特率
    usartInitDef.USART_WordLength=USART_WordLength_8b;//每一帧数据几个比特位
    usartInitDef.USART_StopBits=USART_StopBits_1;//停止位有多长
    usartInitDef.USART_Parity=USART_Parity_No;
    usartInitDef.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//有无硬件流控制
    usartInitDef.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //收发模式
    USART_Init(USART1,&usartInitDef);

    //开启Usart相关的功能
    USART_Cmd(USART1,ENABLE);

    //清除一下发送中断状态
    USART_ClearFlag(USART1, USART_FLAG_TC);
    //开启USART中断[数据接收中断]
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);


    NVIC_InitTypeDef nvicInit;
    nvicInit.NVIC_IRQChannel=USART1_IRQn;
    nvicInit.NVIC_IRQChannelPreemptionPriority=2;
    nvicInit.NVIC_IRQChannelSubPriority=3;
    nvicInit.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&nvicInit);

}

/*
    需求：接收一个字符串  全部接收完了以后 再全部发送

需要我们自己定义一个接收协议：
    前提：连续接收到 /r/n 认为数据发送完毕
    /r=0x0d  /n=0x0a

    协议：使用u16字段记录本次数据有多少个字节，有没有接收到/r  有没有接收到 /r/n
    u16= 0000 0000 0000 0000
    第16个bit位  描述 数据是否接收完毕  0：还要继续接收   1：本次数据接收完毕
    第15个bit位  描述 有没有接收到/r    0:还没有接受到/r  1：已经接受到一个/r -回车 

    准备一个数组：用来去存放我接受到的数据
    0x4000 =0100000000000000
    0x8000 =1000000000000000

*/
u16 USART1_RX_STA=0;  
u8 USART1_RX_BUF[USART1_REC_LEN]; //存放数据用的

void USART1_IRQHandler(void){
    u8 r;
    //判断有消息来
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){
        //接收消息
        r=  USART_ReceiveData(USART1);
        //数据是否已经接受完毕
        if((USART1_RX_STA&0x8000)!=1){//数据还要继续接收
            if(USART1_RX_STA&0x4000){//已经接受到一个/r
                //检查 接下来要处理的数据是不是一个/n
                if(r==0x0a){
                    //数据接收完毕  把最高位设置为1
                    USART1_RX_STA|=0x8000;     
                }else{
                    USART1_RX_STA=0;//接收错误,重新开始
                }
            }else{//还没有接受到/r
                //当前的数据是不是一个/r
                if(r==0x0d){
                    USART1_RX_STA|=0x4000;    
                }else{//当前的数据就是正常的要缓存起来的数据
                   USART1_RX_BUF[USART1_RX_STA&0x3fff]=r;
                   USART1_RX_STA++; 
                   if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  
                }

            }
     
        }
    }



}

